home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok59
/
lists1.4e
/
lists.dok
next >
Wrap
Text File
|
1993-11-04
|
6KB
|
172 lines
(**************************************************************************
:Program. Lists.mod
:Contents. Generic Lists
:Author. Fridtjof Siebert, Hartmut Goebel [hG]
:Language. Oberon
:Translator. AmigaOberon V2.00
:History. V1.0, 17-Jun-90 Fridtjof Siebert
:History. V1.1, 10-Jan-91 H.Goebel: AddSection...,GoForw./Backw.
:History. V1.2, 28-Mar-91 [hG] SetMark, ..Area..->..Mark..
:History. V1.3, 30 Sep 1991 [hG] + GetPred, GetSucc, Swap
:History. V1.4, 17 Oct 1991 [hG] + IsElement, GoForward/BackwardNil
:Date. 17 Oct 1991 20:48:37
**************************************************************************)
Dies ist eine Erweiterung des Oberon-Stardard-Moduls 'Lists'.
Die neuen Funktionen erlauben vor allem das direkte Bearbeiten
mehrerer Listenelemente.
Auch das Markieren von List-Bereiche wird jetzt unterstützt.
Copyright © Original Oberon Standard-Modul 1990 by Fridtjof Siebert
Copyright © Erweiterungen 1990 by Hartmut Goebel
Die Erweiterungen dürfen beliebig weitergegeben werden.
Ein Hinweis zum Copyright:
Da Version 1.1 bereits auf AMOK 51 erschienen ist, denke ich, daß
Fridtjof damit einverstanden ist, das Modul in dieser Form zu
veröffentlichen.
Solle sich jedoch eines schönen(?) Tages das Gegenteil
herausstellen, so können die Ergänzungen aber ohne Probleme einzeln
weitergegeben werden. Jeder Oberon-Besitzer kann sie dann selbst in
seinen (mitgelieferten) Source einbinden.
TYPE
NodePtr = POINTER TO Node;
Node = RECORD END;
List = RECORD END;
Mark = List;
DoProc = PROCEDURE(n: NodePtr);
Der Type Mark ist nur wegen der Zuweisungs-Kompatibilität indentisch
mit List. Die beiden Typen sollten aber als unterschiedlich
betrachtet werden, zumal sich die Definition von Mark in zukünftigen
Versionen des Moduls ändern kann!
PROCEDURE Init(VAR list: List);
PROCEDURE AddHead(VAR list: List; n: NodePtr);
PROCEDURE AddTail(VAR list: List; n: NodePtr);
PROCEDURE Remove(VAR list: List; n: NodePtr);
PROCEDURE RemHead(VAR list: List): NodePtr;
PROCEDURE RemTail(VAR list: List): NodePtr;
PROCEDURE AddBefore(VAR list: List; n, x: NodePtr);
PROCEDURE AddBehind(VAR list: List; n, x: NodePtr);
PROCEDURE Empty(VAR list: List): BOOLEAN;
PROCEDURE CountElements(VAR list: List): LONGINT;
PROCEDURE DoForward(VAR list: List; proc: DoProc);
PROCEDURE DoBackward(VAR list: List; proc: DoProc);
PROCEDURE Next(VAR n: NodePtr): BOOLEAN;
PROCEDURE Previous(VAR n: NodePtr): BOOLEAN;
PROCEDURE Succ(VAR n: NodePtr);
PROCEDURE Pred(VAR n: NodePtr);
PROCEDURE Head(VAR list: List): NodePtr;
PROCEDURE Tail(VAR list: List): NodePtr;
Entsprechen den Prozeduren aus dem Standard-Modul
PROCEDURE GetSucc(n: NodePtr): NodePtr;
PROCEDURE GetPred(n: NodePtr): NodePtr;
Liefern den Nachfolger (Succ) bzw. Vorgänger (Pred) einer Node.
Bsp.: erster := Head(list);
zweiter := GetSucc(erster);
Erzeugt das gleiche wie
erster := Head(list);
zweiter := erster;
zweiter := Succ(zweiter);
PROCEDURE Swap(VAR list: List; a,b: NodePtr);
Vertauscht die Nodes a und b in einer Liste.
PROCEDURE IsElement(VAR list: List; e: NodePtr): BOOLEAN;
Testet, ob die angegebene Node in Element der <list> ist.
PROCEDURE SetMark(VAR mark: Mark; h, t: NodePtr);
Setzt eine Marke auf die Nodes <h> (Anfang) und <t> (Ende) innerhalb
einer bestehden Liste.
Eine Mark sollte vor der ersten Benutzung mit
SetMark(mark,NIL,NIL);
oder SetMark(mark,node1,node2);
initialisiert werden.
Ist EIN Argument NIL, so wird es nicht geändert.
Damit kann man eine der beiden Grenzen ändern, ohne die andere zu
kennen.
Mit dieser Marke kann fast genauso gearbeitet werden, wie mit einer
Liste. Es handelt sich also um eine Unterliste.
Jedoch ist folgendes zu beachen:
- Das Löschen von Nodes aud einer Mark ist jedoch nicht möglich!!
Die Notes müssen aus der Liste gelöscht werden, in der sie stehen.
- Werden Nodes aus der Liste entfernt, ao ist zu beachten, daß ggf.
Head und Tail der MArk neu gesetzt werden müssen (wenn gerade
diese Elemente entfernt wurden).
Es kann sonst zu schlimmen Systemabstützen kommen!
PROCEDURE AddMarkBefore(VAR list: List; mark: Mark; x: NodePtr);
PROCEDURE AddMarkBehind(VAR list: List; mark: Mark; x: NodePtr);
PROCEDURE AddMarkHead(VAR list: List; mark: Mark);
PROCEDURE AddMarkTail(VAR list: List; mark: Mark);
funktionieren wie Add..., jedoch werden die mit der Mark markierten
Elemente eingefügt.
Die Mark, die eingefügt werden soll, kann auch aus nur ein Element
bestehen.
PROCEDURE RemoveMark(VAR list: List; mark: Mark);
entfernt die mit der Mark markierten Elemente aus einer Liste. Die
Mark bleibt hierbei als ein List-Fragment erhalten und kann z.b.
gleich in eine andere Liste eingefügt werden.
Bsp.:
Lists.Init(List2);
Lists.SetMark(Mark,Node1,Node2);
Lists.RemoveMark(List1,Mark);
Lists.AddMarkHead(List2,Mark);
PROCEDURE GoForward(list: List; VAR n: NodePtr; num: LONGINT);
PROCEDURE GoBackward(list: List; VAR n: NodePtr; num: LONGINT);
geht in der angegebenen <list> um <num> Elemente vorwärts/rückwärts,
jedoch nicht weiter als bis Tail/Head(<list>).
PROCEDURE GoForwardNil(VAR n: NodePtr; num: LONGINT);
PROCEDURE GoBackwardNil(VAR n: NodePtr; num: LONGINT);
geht in der angegebenen <list> um <num> Elemente vorwärts/rückwärts,
gibt NIL zurück, falls das Ende er Liste erreicht ist
Reversions:
V1.4, 17 Oct 1991
+ IsElement, GoForwardNil, GoBackwardNil
V1.3, 30-Sep-91
+ GetPred, GetSucc, Swap
V1.2, 28-Mar-91
Mark eingeführt
Sections-Proceduren durch Mark-äquivalente ersetzt.
V1.1, 10-Jan-91
Sections-Procedurem
V1.0, 17-Jun-90
Original Oberon Standard-Modul